[Coding002] LeetCode 15

3Sum

Ben 2023/07/25

More coding records

Get the knowledge flowing and circulating! :)

目录

题目:3Sum

Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.

Notice that the solution set must not contain duplicate triplets.

Example 1:

Example 2:

Example 3:

Constraints:

解题

解题思路

代码

// 错误原因:res中出现了重复的元素 // 分析:排序后的数组为[-4, -1, -1, 0, 1, 2], 所以遍历加入的话,会出现重复的元组[-1, 0, 1]

如何解决呢?

可不可以判断,res这个元素是否已经存在了即将加入的元素呢?

通过检索:确实,对于List这个类而言,有一个方法:

所以,这里把第23行改了。

可是,依然报错(有几个样例是过不了的,这样的方法太耗时了,追溯根源,猜测应该是List的内部实现可能太耗时了吧,目前就不深究了~):

Time Limit Exceeded 308 / 312 testcases passed

 

所以继续寻找解决方法吧!

在网上看了一个视频,但是里面用的是c++实现的,然后我来改写了一下,但是始终没有通过,会报错。

感受

这个解法的视频,分析的确实有些道理,但是实在无法丝滑的想到这个想法,所以我的感受就是,如果现在遇到的解法,我还无法理解,就果断放弃,因为还有很多好的方法,不需要死磕这一种,或许我的认知还没达到,或者,这本身就是一个比较差的方法吧~ anyway, 反正就是再寻找别的方法吧。

双指针解法

还是同样的视频,这个解法更容易理解!

双指针的用法,很棒!

 

复杂度分析

双指针解法,第一个for循环,是O(n)

第二个循环,是从 i + 1 → n - 1, 所以范围也是O(n)

嵌套起来,复杂度就是O(n2)

知识点积累 (Java)

  1. java的List用法

  2. HashMap的计数方法 和 元素遍历方法

  3. Java数组排序的自带函数